package com.rankeiot.ai.message;

import lombok.Data;

import java.util.List;

@Data
public class ChatCompletionRequest {
    String model;
    /**
     * 聊天上下文信息。说明：
     * （1）messages成员不能为空，1个成员表示单轮对话，多个成员表示多轮对话；例如：
     * · 1个成员示例，"messages": [ {"role": "user","content": "你好"}]
     * · 3个成员示例，"messages": [ {"role": "user","content": "你好"},{"role":"assistant","content":"需要什么帮助"},{"role":"user","content":"自我介绍下"}]
     * （2）最后一个message为当前请求的信息，前面的message为历史对话信息
     * （3）成员数目必须为奇数，成员中message的role值说明如下：奇数位messsage的role值必须为user或function，偶数位message的role值为assistant，第一个message的role不能是function。例如：
     * 示例中message中的role值分别为user、assistant、user、assistant、user；奇数位（红框）message中的role值为user，即第1、3、5个message中的role值为user；偶数位（蓝框）值为assistant，即第2、4个message中的role值为assistant
     * image.png
     * （4）最后一个message的content长度（即此轮对话的问题）、functions和system字段总内容不能超过8000 个字符，且不能超过2000 tokens
     * （5）如果messages中content总长度大于8000 个字符，系统会依次遗忘最早的历史会话，直到content的总长度不超过8000 个字符
     */
    List<ChatMessage> messages;
    /**
     * 一个可触发函数的描述列表，说明：
     * （1）支持的function数量无限制
     * （2）长度限制，最后一个message的content长度（即此轮对话的问题）、functions和system字段总内容不能超过8000 个字符，且不能超过2000 tokens
     */
    List<Function> functions;
    /**
     * 说明：
     * （1）较高的数值会使输出更加随机，而较低的数值会使其更加集中和确定
     * （2）默认0.8，范围 (0, 1.0]，不能为0
     */
    Float temperature;
    /**
     * 说明：
     * （1）影响输出文本的多样性，取值越大，生成文本的多样性越强
     * （2）默认0.8，取值范围 [0, 1.0]
     */
    Float top_p;
    /**
     * 通过对已生成的token增加惩罚，减少重复生成的现象。说明：
     * （1）值越大表示惩罚越大
     * （2）默认1.0，取值范围：[1.0, 2.0]
     */
    Float penalty_score;
    /**
     * 是否以流式接口的形式返回数据，默认false
     */
    Boolean stream=false;
    /**
     * 模型人设，主要用于人设设定，例如，你是xxx公司制作的AI助手，说明：
     * （1）长度限制，最后一个message的content长度（即此轮对话的问题）、functions和system字段总内容不能超过8000 个字符，且不能超过2000 tokens
     * （2）如果同时使用system和functions，可能暂无法保证使用效果，持续进行优化
     */
    String system;
    /**
     * 生成停止标识，当模型生成结果以stop中某个元素结尾时，停止文本生成。说明：
     * （1）每个元素长度不超过20字符
     * （2）最多4个元素
     */
    List<String> stop;
    /**
     * 是否强制关闭实时搜索功能，默认false，表示不关闭
     */
    Boolean disable_search;

    /**
     * 是否开启上角标返回，说明：
     * （1）开启后，有概率触发搜索溯源信息search_info，search_info内容见响应参数介绍
     * （2）默认false，不开启
     */
    Boolean enable_citation;
    /**
     * 指定模型最大输出token数，范围[2, 2048]
     */
    Integer max_output_tokens;

    /**
     * 指定响应内容的格式，说明：
     * （1）可选值：
     * · json_object：以json格式返回，可能出现不满足效果情况
     * · text：以文本格式返回
     * （2）如果不填写参数response_format值，默认为text
     */
    String response_format;
    /**
     * 表示最终用户的唯一标识符
     */
    String user_id;
    /**
     * 函数调用，function call场景下第一轮对话的返回，第二轮对话作为历史信息在message中传入
     */
    ToolChoice tool_choice;

    public void setToolChoice(String name){
        this.tool_choice = new ToolChoice(name);
    }
}
